import fs from "fs"
import path from "path"

// 獲取當前執行目錄的最佳方式
const getCurrentDir = () => {
    // Bun 和 Node.js 都支持 process.cwd()
    const workingDir = process.cwd()

    // 假設腳本在 tools 目錄下運行
    if (workingDir.endsWith("tools")) {
        return workingDir
    }

    // 假設腳本在項目根目錄運行
    const toolsDir = path.join(workingDir, "tools")
    if (fs.existsSync(toolsDir)) {
        return workingDir
    }

    // 其他情況下，嘗試尋找 src 目錄
    if (fs.existsSync(path.join(workingDir, "src"))) {
        return workingDir
    }

    // 最後嘗試向上一級尋找
    return path.resolve(workingDir, "..")
}

// 取得當前目錄
const currentDir = getCurrentDir()

// 設定路徑
const SRC_DIR = path.resolve(currentDir, "src")
const TARGET_DIR = path.resolve(currentDir, "src/assets/images")

// 打印實際使用的路徑，方便調試
console.log(`當前執行目錄: ${currentDir}`)
console.log(`SRC_DIR: ${SRC_DIR}`)
console.log(`TARGET_DIR: ${TARGET_DIR}`)

// 需要尋找的資料夾名稱
const SOURCE_FOLDER_NAMES = ["source", "sources"]

// 確保目標目錄存在
function ensureDirectoryExists(dirPath: string): void {
    if (!fs.existsSync(dirPath)) {
        fs.mkdirSync(dirPath, { recursive: true })
        console.log(`建立目錄: ${dirPath}`)
    }
}

// 複製檔案
function copyFile(source: string, target: string): void {
    try {
        fs.copyFileSync(source, target)
        console.log(`已複製: ${source} -> ${target}`)
    } catch (err) {
        console.error(`複製檔案失敗: ${source}`, err)
    }
}

// 遞迴複製整個資料夾
function copyDirectory(source: string, target: string): void {
    // 確保目標資料夾存在
    ensureDirectoryExists(target)

    // 讀取資料夾內容
    const items = fs.readdirSync(source)

    // 遍歷所有項目
    for (const item of items) {
        const sourcePath = path.join(source, item)
        const targetPath = path.join(target, item)

        // 檢查是否為資料夾
        if (fs.statSync(sourcePath).isDirectory()) {
            // 遞迴複製子資料夾
            copyDirectory(sourcePath, targetPath)
        } else {
            // 複製檔案
            copyFile(sourcePath, targetPath)
        }
    }
}

// 處理找到的 source 資料夾
function processSourceFolder(sourcePath: string): void {
    // 計算相對於 src 的路徑
    const relativePath = path.relative(SRC_DIR, path.dirname(sourcePath))

    // 建立目標路徑
    const targetPath = path.join(TARGET_DIR, relativePath)

    console.log(`處理資料夾: ${sourcePath}`)
    console.log(`目標路徑: ${targetPath}`)

    // 複製整個資料夾內容
    copyDirectory(sourcePath, targetPath)

    // 計算移動的檔案數量
    const fileCount = countFiles(sourcePath)
    console.log(`從 ${sourcePath} 移動了 ${fileCount} 個檔案`)
}

// 計算資料夾中的檔案數量
function countFiles(dirPath: string): number {
    let count = 0
    const items = fs.readdirSync(dirPath)

    for (const item of items) {
        const itemPath = path.join(dirPath, item)
        if (fs.statSync(itemPath).isDirectory()) {
            count += countFiles(itemPath)
        } else {
            count++
        }
    }

    return count
}

// 遞迴查找所有 source 資料夾
function findSourceFolders(dirPath: string): number {
    let foldersFound = 0
    // 讀取資料夾內容
    const items = fs.readdirSync(dirPath)

    // 遍歷所有項目
    for (const item of items) {
        const itemPath = path.join(dirPath, item)

        // 檢查是否為資料夾
        if (fs.statSync(itemPath).isDirectory()) {
            // 檢查是否為目標資料夾
            if (SOURCE_FOLDER_NAMES.includes(item.toLowerCase())) {
                processSourceFolder(itemPath)
                foldersFound++
            } else {
                // 遞迴搜尋子資料夾
                foldersFound += findSourceFolders(itemPath)
            }
        }
    }

    return foldersFound
}

// 主函數
function main(): void {
    console.log("開始移動靜態資源檔案...")
    console.log(`搜尋路徑: ${SRC_DIR}`)
    console.log(`目標路徑: ${TARGET_DIR}`)
    console.log("-----------------------------------")

    // 確保目標資料夾存在
    ensureDirectoryExists(TARGET_DIR)

    // 開始搜尋
    const foldersFound = findSourceFolders(SRC_DIR)

    // 顯示結果
    console.log("-----------------------------------")
    console.log(`完成! 共處理了 ${foldersFound} 個資料夾`)

    if (foldersFound === 0) {
        console.log("沒有找到任何 source 或 sources 資料夾")
    }
}

// 執行主函數
main()
